package net.atos.java.example.boodschappen.persistence.model;

import java.math.BigDecimal;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import net.atos.java.example.boodschappen.model.Boodschap;
import net.atos.java.example.boodschappen.model.Entity;
import net.atos.java.example.boodschappen.model.HoeveelheidEenheid;

/**
 * Een persistente boodschape.
 * 
 * @author Pal Hargitai
 */
@PersistenceCapable
public class PersistentBoodschap implements Entity<String> {

	/** De boodschap primaire sleutel. */
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.UUIDSTRING)
	private String pk;
	/** De boodschap naam. */
	@Persistent
	private String naam;
	/** De boodschap hoeveelheid. */
	@Persistent
	private BigDecimal hoeveelheid;
	/** De boodschap hoeveelheid eenheid. */
	@Persistent
	private HoeveelheidEenheid hoeveelheidEenheid;
	/** De gebruiker identificatie. */
	@Persistent
	private String gebruikerId;

	/**
	 * Haalt de pk waarde op.
	 * 
	 * @return De pk waarde.
	 */
	public String getPk() {
		return pk;
	}

	/**
	 * Zet een nieuwe waarde voor het pk veld.
	 * 
	 * @param pk
	 *            De nieuwe waarde voor het pk veld.
	 */
	public void setPk(String pk) {
		this.pk = pk;
	}

	/**
	 * Haalt de naam waarde op.
	 * 
	 * @return De naam waarde.
	 */
	public String getNaam() {
		return naam;
	}

	/**
	 * Zet een nieuwe waarde voor het naam veld.
	 * 
	 * @param naam
	 *            De nieuwe waarde voor het naam veld.
	 */
	public void setNaam(String naam) {
		this.naam = naam;
	}

	/**
	 * Haalt de hoeveelheid waarde op.
	 * 
	 * @return De hoeveelheid waarde.
	 */
	public BigDecimal getHoeveelheid() {
		return hoeveelheid;
	}

	/**
	 * Zet een nieuwe waarde voor het hoeveelheid veld.
	 * 
	 * @param hoeveelheid
	 *            De nieuwe waarde voor het hoeveelheid veld.
	 */
	public void setHoeveelheid(BigDecimal hoeveelheid) {
		this.hoeveelheid = hoeveelheid;
	}

	/**
	 * Haalt de hoeveelheidEenheid waarde op.
	 * 
	 * @return De hoeveelheidEenheid waarde.
	 */
	public HoeveelheidEenheid getHoeveelheidEenheid() {
		return hoeveelheidEenheid;
	}

	/**
	 * Zet een nieuwe waarde voor het hoeveelheidEenheid veld.
	 * 
	 * @param hoeveelheidEenheid
	 *            De nieuwe waarde voor het hoeveelheidEenheid veld.
	 */
	public void setHoeveelheidEenheid(HoeveelheidEenheid hoeveelheidEenheid) {
		this.hoeveelheidEenheid = hoeveelheidEenheid;
	}

	/**
	 * Haalt de gebruikerId waarde op.
	 * 
	 * @return De gebruikerId waarde.
	 */
	public String getGebruikerId() {
		return gebruikerId;
	}

	/**
	 * Zet een nieuwe waarde voor het gebruikerId veld.
	 * 
	 * @param gebruikerId
	 *            De nieuwe waarde voor het gebruikerId veld.
	 */
	public void setGebruikerId(String gebruikerId) {
		this.gebruikerId = gebruikerId;
	}

	/** {@inheritDoc} */
	@Override
	public String getIdentificatie() {
		return getPk();
	}


	/**
	 * De boodschap bouwer.
	 * 
	 * @author Pal Hargitai
	 */
	public static class Builder {
		/** Identificatie. */
		private String identificatie;
		/** Gekoppelde gebruiker. */
		private String gebruiker;
		/** Boodschap. */
		private String boodschap;
		/** Hoeveelheid. */
		private BigDecimal hoeveelheid;
		/** Eenheid. */
		private HoeveelheidEenheid eenheid = HoeveelheidEenheid.GRAM;

		/**
		 * Bouwt de boodschap.
		 * @return De boodschap.
		 */
		public PersistentBoodschap build() {
			PersistentBoodschap result = new PersistentBoodschap();
			result.setNaam(boodschap);
			result.setHoeveelheidEenheid(eenheid);
			result.setGebruikerId(gebruiker);
			result.setHoeveelheid(hoeveelheid);
			result.setPk(identificatie);
			return result;
		}

		/**
		 * Zet de gebruiker.
		 * @param gebruiker De nieuwe gebruiker.
		 * @return De builder.
		 */
		public Builder gebruiker(String gebruiker) {
			this.gebruiker = gebruiker;
			return this;
		}

		/**
		 * Vult de boodschap op basis van de domein boodschap.
		 * @param boodschap De beginnende boodschap.
		 * @return De builder.
		 */
		public Builder boodschap(Boodschap boodschap) {
			this.naam(boodschap.getBoodschap());
			if (boodschap.getEenheid() != null) {
				switch (boodschap.getEenheid()) {					
				case GRAM:
					this.eenheid = HoeveelheidEenheid.GRAM;
					break;
				case KILOGRAM:
					this.eenheid = HoeveelheidEenheid.KILOGRAM;
					break;
				case LITER:
					this.eenheid = HoeveelheidEenheid.LITER;
					break;
				case MILILITER:
					this.eenheid = HoeveelheidEenheid.MILILITER;
					break;
				case AANTAL:
				default:
					this.eenheid = HoeveelheidEenheid.AANTAL;
				}
			} else {
				this.eenheid = HoeveelheidEenheid.GRAM;
			}
			this.gebruiker(boodschap.getGebruiker());
			this.hoeveelheid(boodschap.getHoeveelheid());
			this.identificatie(boodschap.getIdentificatie());
			return this;
		}

		/**
		 * Zet de hoeveelheid.
		 * @param hoeveelheid De nieuwe hoeveelheid.
		 * @return De builder.
		 */
		public Builder hoeveelheid(BigDecimal hoeveelheid) {
			this.hoeveelheid = hoeveelheid;
			return this;
		}

		/**
		 * Zet de eenheid.
		 * @param hoeveelheidEenheid De nieuwe eenheid.
		 * @return De builder.
		 */
		public Builder hoeveelheidEenheid(HoeveelheidEenheid hoeveelheidEenheid) {
			this.eenheid = hoeveelheidEenheid;
			return this;
		}

		/**
		 * Zet de naam.
		 * @param naam De naam.
		 * @return De builder.
		 */
		public Builder naam(String naam) {
			this.boodschap = naam;
			return this;
		}

		/**
		 * Zet de identificatie.
		 * @param identificatie De identificatie.
		 * @return De builder.
		 */
		public Builder identificatie(String identificatie) {
			this.identificatie = identificatie;
			return this;
		}
	}
}
